using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DefenseTools._DistanceandDirection
{
    /// <summary>
    /// <para>Generate Range Rings From Features</para>
    /// <para>Creates range rings with attributes derived from fields in a point feature class.</para>
    /// <para>使用从点要素类中的字段派生的属性创建范围环。</para>
    /// </summary>    
    [DisplayName("Generate Range Rings From Features")]
    public class GenerateRangeRingsFromFeatures : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GenerateRangeRingsFromFeatures()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The point feature set that identifies the center of the range ring. The input must have at least one point.</para>
        /// <para>用于标识范围环中心的点要素集。输入必须至少有一个点。</para>
        /// </param>
        /// <param name="_output_feature_class">
        /// <para>Output Range Ring Feature Class</para>
        /// <para>The feature class that will contain the output ring features.</para>
        /// <para>将包含输出环要素的要素类。</para>
        /// </param>
        /// <param name="_range_rings_type">
        /// <para>Range Ring Type</para>
        /// <para><xdoc>
        ///   <para>Specifies how range rings will be generated..</para>
        ///   <bulletList>
        ///     <bullet_item>Interval—Range rings will be generated based on the number of rings and distance between rings. This the default.</bullet_item><para/>
        ///     <bullet_item>Minimum and maximum—Range rings will be generated based on a minimum and maximum distance.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定范围环的生成方式。</para>
        ///   <bulletList>
        ///     <bullet_item>间隔—将根据环的数量和环之间的距离生成范围环。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>最小值和最大值—将根据最小距离和最大距离生成范围环。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public GenerateRangeRingsFromFeatures(object _in_features, object _output_feature_class, _range_rings_type_value _range_rings_type)
        {
            this._in_features = _in_features;
            this._output_feature_class = _output_feature_class;
            this._range_rings_type = _range_rings_type;
        }
        public override string ToolboxName => "Defense Tools";

        public override string ToolName => "Generate Range Rings From Features";

        public override string CallName => "defense.GenerateRangeRingsFromFeatures";

        public override List<string> AcceptEnvironments => ["outputCoordinateSystem", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_features, _output_feature_class, _range_rings_type.GetGPValue(), _out_feature_class_radials, _radial_count_field, _min_range_field, _max_range_field, _ring_count_field, _ring_interval_field, _distance_units.GetGPValue()];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The point feature set that identifies the center of the range ring. The input must have at least one point.</para>
        /// <para>用于标识范围环中心的点要素集。输入必须至少有一个点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Output Range Ring Feature Class</para>
        /// <para>The feature class that will contain the output ring features.</para>
        /// <para>将包含输出环要素的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Range Ring Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _output_feature_class { get; set; }


        /// <summary>
        /// <para>Range Ring Type</para>
        /// <para><xdoc>
        ///   <para>Specifies how range rings will be generated..</para>
        ///   <bulletList>
        ///     <bullet_item>Interval—Range rings will be generated based on the number of rings and distance between rings. This the default.</bullet_item><para/>
        ///     <bullet_item>Minimum and maximum—Range rings will be generated based on a minimum and maximum distance.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定范围环的生成方式。</para>
        ///   <bulletList>
        ///     <bullet_item>间隔—将根据环的数量和环之间的距离生成范围环。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>最小值和最大值—将根据最小距离和最大距离生成范围环。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Range Ring Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _range_rings_type_value _range_rings_type { get; set; }

        public enum _range_rings_type_value
        {
            /// <summary>
            /// <para>Interval</para>
            /// <para>Interval—Range rings will be generated based on the number of rings and distance between rings. This the default.</para>
            /// <para>间隔—将根据环的数量和环之间的距离生成范围环。这是默认设置。</para>
            /// </summary>
            [Description("Interval")]
            [GPEnumValue("INTERVAL")]
            _INTERVAL,

            /// <summary>
            /// <para>Minimum and maximum</para>
            /// <para>Minimum and maximum—Range rings will be generated based on a minimum and maximum distance.</para>
            /// <para>最小值和最大值—将根据最小距离和最大距离生成范围环。</para>
            /// </summary>
            [Description("Minimum and maximum")]
            [GPEnumValue("MIN_MAX")]
            _MIN_MAX,

        }

        /// <summary>
        /// <para>Output Feature Class (Radials)</para>
        /// <para>The feature class that will contain the output radial features.</para>
        /// <para>将包含输出径向要素的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class (Radials)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _out_feature_class_radials { get; set; } = null;


        /// <summary>
        /// <para>Radial Count Field</para>
        /// <para>The field that contains the number of radials to be created.</para>
        /// <para>包含要创建的径向数的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Radial Count Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _radial_count_field { get; set; } = null;


        /// <summary>
        /// <para>Minimum Range Field</para>
        /// <para>The field that contains the values for the distance from the origin point to the inner ring.</para>
        /// <para>包含从原点到内环的距离值的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Minimum Range Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _min_range_field { get; set; } = null;


        /// <summary>
        /// <para>Maximum Range Field</para>
        /// <para>The field that contains the values for the distance from the origin point to the outer ring.</para>
        /// <para>包含从原点到外环的距离值的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Maximum Range Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _max_range_field { get; set; } = null;


        /// <summary>
        /// <para>Ring Count Field</para>
        /// <para>The field that contains the values for the number of rings to generate.</para>
        /// <para>包含要生成的环数值的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Ring Count Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _ring_count_field { get; set; } = null;


        /// <summary>
        /// <para>Ring Interval Field</para>
        /// <para>The field that contains the values for the interval between rings.</para>
        /// <para>包含环之间间隔值的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Ring Interval Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _ring_interval_field { get; set; } = null;


        /// <summary>
        /// <para>Distance Units</para>
        /// <para><xdoc>
        ///   <para>Specifies the linear unit of measure for the value in the Ring Interval Field parameter or the values in the Minimum Range Field and Maximum Range Field parameters.</para>
        ///   <bulletList>
        ///     <bullet_item>Meters—The unit will be meters. This is the default.</bullet_item><para/>
        ///     <bullet_item>Kilometers—The unit will be kilometers.</bullet_item><para/>
        ///     <bullet_item>Miles—The unit will be miles.</bullet_item><para/>
        ///     <bullet_item>Nautical miles—The unit will be nautical miles.</bullet_item><para/>
        ///     <bullet_item>Feet—The unit will be feet.</bullet_item><para/>
        ///     <bullet_item>US survey feet—The unit will be U.S. survey feet.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定“环间隔字段”参数中的值或“最小范围字段”和“最大范围字段”参数中的值的线性度量单位。</para>
        ///   <bulletList>
        ///     <bullet_item>米—单位将为米。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>千米—单位将为千米。</bullet_item><para/>
        ///     <bullet_item>英里—单位将为英里。</bullet_item><para/>
        ///     <bullet_item>海里—单位将为海里。</bullet_item><para/>
        ///     <bullet_item>英尺—单位将为英尺。</bullet_item><para/>
        ///     <bullet_item>美国测量英尺—单位为美国测量英尺。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Distance Units")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _distance_units_value _distance_units { get; set; } = _distance_units_value._METERS;

        public enum _distance_units_value
        {
            /// <summary>
            /// <para>Meters</para>
            /// <para>Meters—The unit will be meters. This is the default.</para>
            /// <para>米—单位将为米。这是默认设置。</para>
            /// </summary>
            [Description("Meters")]
            [GPEnumValue("METERS")]
            _METERS,

            /// <summary>
            /// <para>Kilometers</para>
            /// <para>Kilometers—The unit will be kilometers.</para>
            /// <para>千米—单位将为千米。</para>
            /// </summary>
            [Description("Kilometers")]
            [GPEnumValue("KILOMETERS")]
            _KILOMETERS,

            /// <summary>
            /// <para>Miles</para>
            /// <para>Miles—The unit will be miles.</para>
            /// <para>英里—单位将为英里。</para>
            /// </summary>
            [Description("Miles")]
            [GPEnumValue("MILES")]
            _MILES,

            /// <summary>
            /// <para>Nautical miles</para>
            /// <para>Nautical miles—The unit will be nautical miles.</para>
            /// <para>海里—单位将为海里。</para>
            /// </summary>
            [Description("Nautical miles")]
            [GPEnumValue("NAUTICAL_MILES")]
            _NAUTICAL_MILES,

            /// <summary>
            /// <para>Feet</para>
            /// <para>Feet—The unit will be feet.</para>
            /// <para>英尺—单位将为英尺。</para>
            /// </summary>
            [Description("Feet")]
            [GPEnumValue("FEET")]
            _FEET,

            /// <summary>
            /// <para>US survey feet</para>
            /// <para>US survey feet—The unit will be U.S. survey feet.</para>
            /// <para>美国测量英尺—单位为美国测量英尺。</para>
            /// </summary>
            [Description("US survey feet")]
            [GPEnumValue("US_SURVEY_FEET")]
            _US_SURVEY_FEET,

        }

        public GenerateRangeRingsFromFeatures SetEnv(object outputCoordinateSystem = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}